#ifndef MATH_ERROR_THROW_MATRIX
#define MATH_ERROR_THROW_MATRIX

#include "Throw_MathSpecialization.hpp"



namespace Math
{

namespace E_Math
{



template <typename T, typename K = T>    
class EXCMatrix : public EXCMath<T,K>
  {
      public:
          ~EXCMatrix() {}
          EXCMatrix() = delete;
          EXCMatrix(const EXCMatrix<T,K>& copy) = delete;
          EXCMatrix(EXCMatrix<T,K>&& move)
            {
                error_pointer      = move.error_pointer;
                move.error_pointer = nullptr;
            }
          EXCMatrix(const Matrix<T,K>* const epointer)
            {
                if(epointer == nullptr || epointer == NULL) error_pointer = nullptr;
                  else error_pointer = new Matrix<T,K>(*epointer);
            }

          const Matrix<T,K>* GetErrorPointer()   const   { return error_pointer; }


      private:
          const Matrix<T,K>* error_pointer;
  };






template <typename T, typename K = T>
class IndexIsTooHighMatrix : public EXCMatrix<T,K>, public IndexIsTooHigh<T,K> 
    {
        public:
            ~IndexIsTooHighMatrix() {}
            IndexIsTooHighMatrix(const IndexIsTooHighMatrix<T,K>& copy) = delete;
            IndexIsTooHighMatrix() = delete;
            IndexIsTooHighMatrix(IndexIsTooHighMatrix<T,K>&& move):
              EXCMatrix<T,K>((IndexIsTooHighMatrix<T,K>&&)move)
              {}
            IndexIsTooHighMatrix(const Matrix<T,K>* epointer, const char* const str):
              EXCMatrix<T,K>(epointer)
              {
                  #ifdef DISPERROR_MATH_VECTOR_IndexIsTooHighMatrix
                  std::cout << str;
                  #endif
              }
    };





} // end namespace E_Math
} // end namesapce Math


#endif
